
var store_organizacion;
var store_cuenta;
var store_editor;
var store_tipo;

Ext.onReady(function()
{
    store_organizacion = new X.store.Json({
        fields : [
            'codigoOrganizacion',
            'razonSocial'
        ]
    });

    store_tipo = new X.store.Json({
        fields : [
            'codigoDocumento',
            'nombreDocumento'
        ]
    });
    
    store_cuenta = new X.store.Json({
        fields : [
            'codigoCuenta',
            'nombreRubro',
            'codigo',
            'valueField'
        ]
    });

    store_cuenta.addListener('load', function(store, records, options){
        for(var i=0; i<store.getCount(); i++){
            var record = store.getAt(i);
            record.set('valueField', record.get('codigo') + ' ' + record.get('nombreRubro'));
        }
    });

    store_editor = new X.store.Json({
        fields : [
            'codigoComprobante',
            'numeroComprobante',
            'fechaComprobante',
            'codigoOrganizacion',
            'codigoDocumento',
            'cantidad',
            'concepto',
            'monto',
            'observaciones',
            'codigo',
            'codigoCuenta',
            'codigoMovimiento'
        ]
    });

    var combo = new X.field.Combo ({
        valueField   : 'codigoCuenta',
        displayField : 'valueField',
        width        : 230,
        store        : store_cuenta,
        editable     : true
    });
    var combo_organizacion = new X.field.Combo ({
        id           : 'organizacion',
        fieldLabel   : 'Proveedor',
        hiddenName   : 'codigoOrganizacion',
        valueField   : 'codigoOrganizacion',
        displayField : 'razonSocial',
        width        : 230,
        store        : store_organizacion,
        allowBlank   : true
    });
    var combo_tipo = new X.field.Combo ({
        id           : 'tipo',
        fieldLabel   : 'Tipo',
        hiddenName   : 'codigoDocumento',
        valueField   : 'codigoDocumento',
        displayField : 'nombreDocumento',
        width        : 230,
        store        : store_tipo,
        allowBlank   : true
    });

    // form invisible para hacer el submit de eliminar el movimiento
    var formSubmitEliminar = new Ext.form.FormPanel({
        renderTo : 'layout_content',
        hidden   : true
    });

    function eliminar_seleccionado(idSeleccionado){
        
        store_editor.idSeleccionado = idSeleccionado;

        formSubmitEliminar.getForm().submit({
            url       : '/egresocc/ajax-eliminar',
            waitTitle : 'Aguarde un momento.',
            waitMsg   : 'Eliminando el movimiento seleccionado...',
            params    : {
                id : idSeleccionado
            },
            success : function(form, action){
                try{
                    X.msg.Success(action.result.msg);

                    for (var i=0; i<store_editor.getCount(); i++){
                        if (store_editor.getAt(i).get('codigoMovimiento') == store_editor.idSeleccionado){
                            store_editor.removeAt(i);
                            actualizar_monto_total();
                            break;
                        }
                    }
                }
                catch(e){X.msg.FailureJs(e.message);}
            },
            failure : function(form, action){
                try{
                    if (action.failureType === Ext.form.Action.SERVER_INVALID){
                        X.msg.Failure(action.result.msg);
                    }
                    else X.msg.Failure('respuesta inválida del servidor');
                }
                catch(e){X.msg.FailureJs(e.message);}
            }
        });
    }

    function actualizar_monto_total(){
        try{
            var sum = 0;
            var record;
            for (var i=0; i< store_editor.getCount(); i++){
                record = store_editor.getAt(i);
                sum += parseInt( record.get('monto') );
            }
            Ext.getCmp('monto').setValue(sum);
        }
        catch(e){
            X.msg.FailureJs(e.message);
        }
    }

    var grid = new X.grid.GridEditor({

        id       : 'editor',
        height   : 250,
        width    : 1156,
        store    : store_editor,
        useTbar  : false,

        sm: new Ext.grid.RowSelectionModel({singleSelect:true}),
        columns:[
            new X.column.Number({header: 'Comprobante',   dataIndex: 'numeroComprobante',  width: 90,  editor: new X.field.Number({allowNegative:false, allowDecimals:false})}),
            new X.column.Date  ({header: 'Fecha',         dataIndex: 'fechaComprobante',   width: 85,  editor: new X.field.Date({
                listeners:{
                    change:function(field, newv, oldv){
                        if (newv.getYear() != oldv.getYear()){
                            X.msg.Failure('No se permite modificar el año.');
                            field.setValue(oldv);
                        }
                    }
                }
            })}),
            new X.column.Combo ({header: 'Proveedor',     dataIndex: 'codigoOrganizacion', width: 120, editor: combo_organizacion  }),
            new X.column.Combo ({header: 'Tipo',          dataIndex: 'codigoDocumento',    width: 70,  editor: combo_tipo  }),

            new X.column.Number({header: 'Cantidad',      dataIndex: 'cantidad',           width: 57,  editor: new X.field.Number({allowNegative:false, allowDecimals:false})}),
            new X.column.Text  ({header: 'Concepto',      dataIndex: 'concepto',           width: 200, editor: new X.field.Text()  }),
            new X.column.Money ({header: 'Monto',         dataIndex: 'monto',              width: 90,  editor: new X.field.Number({allowNegative:false, allowDecimals:false})}),
            new X.column.Text  ({header: 'Observaciones', dataIndex: 'observaciones',      width: 200, editor: new X.field.Text()  }),
            new X.column.Combo ({header: 'Rubro',         dataIndex: 'codigoCuenta',       width: 200, editor: combo})
        ],
        tbar:[
            {text:'Eliminar seleccionado (permanente)', icon:'/img/icon_eliminar.png', handler:function(){
                    if ( grid.getSelectionModel().getCount() == 1){
                        eliminar_seleccionado(
                            grid.getSelectionModel().getSelected().get('codigoMovimiento')
                        );
                    }
                    
            }}
        ]
    });

    // actualizar los datos del comprobante para otros movimientos
    grid.addListener('afteredit', function(e){
        if (e.field == 'numeroComprobante'  ||
            e.field == 'fechaComprobante'   ||
            e.field == 'codigoOrganizacion' ||
            e.field == 'codigoDocumento'    ){
            for (var i=0; i<store_editor.getCount(); i++){
                var r = store_editor.getAt(i);
                if ((e.field == 'numeroComprobante' && r.get('numeroComprobante') == e.originalValue                  ) ||
                    (e.field != 'numeroComprobante' && r.get('numeroComprobante') == e.record.get('numeroComprobante')) ){
                    r.set(e.field, e.value);
                    r.commit();
                }
            }
        }
        e.record.commit();
        actualizar_monto_total();
    });

    var form= new X.form.FormPanel({

        title            : 'Editar Solicitud de Reembolso de Caja Chica',
        submitButtonText : 'Guardar',
        returnButtonText : 'Cancelar',
        submitUrl        : '/solicitudcc/ajax-editar',
        returnUrl        : '/solicitudcc/listar',
        width            : 1220,
        height           : 500,
        labelWidth       : 90,
        layout           : 'absolute',

        items:[
            new Ext.form.FieldSet({title:'Solicitud', x: 10, y: 5, width: 370, items:
            [
                new X.field.Hidden({                           id:'editorRows'               }),
                new X.field.Hidden({                           id:'codigoSolicitud'          }),
                new X.field.Date  ({fieldLabel:'Fecha',        id:'fechaSolicitud', width:230,
                    listeners:{
                        change:function(field, newv, oldv){
                            if (newv.getYear() != oldv.getYear()){
                                field.setValue(oldv);
                                X.msg.Failure('No se permite modificar el año.');
                            }
                        }
                    }}),
                new X.field.Number({fieldLabel:'Monto Total',  id:'monto',          width:230, readOnly: true}),
                new X.field.Text  ({fieldLabel:'Cheque Orden', id:'chequeOrden',    width:230})
            ]}),
            new Ext.form.FieldSet({title:'Detalles', x: 410, y: 5, width: 370, items:
            [
                new X.field.Text({fieldLabel:'Concepto',      id:'concepto',      width:230, allowBlank: true}),
                new X.field.Text({fieldLabel:'Observaciones', id:'observaciones', width:230, allowBlank: true})
            ]}),
            new Ext.form.FieldSet({title:'Egresos de Caja Chica', x: 10, y: 130,items:
            [
                grid
            ]})
        ]
    });

     form.getForm().addListener('beforeaction', function(form, action){
        if (Ext.isEmpty(Ext.getCmp('fechaSolicitud').getValue())){
            X.msg.Failure('Complete con una "Fecha"'); return false;
        }
        if (Ext.isEmpty(Ext.getCmp('chequeOrden').getValue())){
            X.msg.Failure('Complete el campo "cheque orden"'); return false;
        }
        if (store_editor.getCount() <= 0){
            X.msg.Failure('Agregue al menos un movimiento'); return false;
        }
        for (var i=0; i<store_editor.getCount(); i++){
            var record = store_editor.getAt(i);
            if (Ext.isEmpty(record.get('numeroComprobante'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Nº comprobante" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('fechaComprobante'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Fecha" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('codigoOrganizacion'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Proveedor" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('codigoDocumento'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Tipo" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('cantidad'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Cantidad" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('concepto'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Concepto" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('monto'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Monto" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('observaciones'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Observaciones" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('codigoCuenta'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Rubro" incompleto'); return false;
            }          
        }
        return true;
    });
});
